package com.spark.client.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Spring Boot 版本检测工具
 */
public class SpringBootVersionDetector {
    
    private static final Logger logger = LoggerFactory.getLogger(SpringBootVersionDetector.class);
    
    private static Boolean isSpringBoot3 = null;
    
    /**
     * 检测是否为 Spring Boot 3.x
     * @return true 如果是 Spring Boot 3.x，false 如果是 2.x
     */
    public static boolean isSpringBoot3() {
        if (isSpringBoot3 == null) {
            try {
                // 尝试加载 Spring Boot 3.x 特有的类
                Class.forName("org.springframework.boot.autoconfigure.AutoConfiguration");
                isSpringBoot3 = true;
                logger.info("检测到 Spring Boot 3.x");
            } catch (ClassNotFoundException e) {
                try {
                    // 检查是否存在 Spring Boot 2.x 的类
                    Class.forName("org.springframework.boot.autoconfigure.EnableAutoConfiguration");
                    isSpringBoot3 = false;
                    logger.info("检测到 Spring Boot 2.x");
                } catch (ClassNotFoundException ex) {
                    // 默认假设是较新版本
                    isSpringBoot3 = true;
                    logger.warn("无法确定 Spring Boot 版本，默认使用 3.x 模式");
                }
            }
        }
        return isSpringBoot3;
    }
    
    /**
     * 检测 Jakarta 注解是否可用
     * @return true 如果 Jakarta 注解可用
     */
    public static boolean isJakartaAnnotationAvailable() {
        try {
            Class.forName("jakarta.annotation.Resource");
            return true;
        } catch (ClassNotFoundException e) {
            return false;
        }
    }
    
    /**
     * 检测 Javax 注解是否可用
     * @return true 如果 Javax 注解可用
     */
    public static boolean isJavaxAnnotationAvailable() {
        try {
            Class.forName("javax.annotation.Resource");
            return true;
        } catch (ClassNotFoundException e) {
            return false;
        }
    }
    
    /**
     * 获取版本信息
     * @return 版本信息字符串
     */
    public static String getVersionInfo() {
        StringBuilder info = new StringBuilder();
        info.append("Spring Boot: ").append(isSpringBoot3() ? "3.x" : "2.x");
        info.append(", Jakarta: ").append(isJakartaAnnotationAvailable() ? "可用" : "不可用");
        info.append(", Javax: ").append(isJavaxAnnotationAvailable() ? "可用" : "不可用");
        return info.toString();
    }
}
